package edu.cibertec.alquiler.dao.persistence;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;

import util.EnviarCorreo;

import edu.cibertec.alquiler.dao.UsuarioDAO;
import edu.cibertec.alquiler.entity.Estado;
import edu.cibertec.alquiler.entity.Perfil;
import edu.cibertec.alquiler.entity.Usuario;
import edu.cibertec.alquiler.entity.Video;

public class UsuarioJPADAO implements UsuarioDAO {
	private EntityManagerFactory emf;
	private EntityManager em;
	
	public void setEntityManagerFactory(EntityManagerFactory emf){
		this.emf=emf;
	}

	@Override
	public void insertarNuevoUsuario(Usuario bean) throws Exception {
		em=emf.createEntityManager();
		Estado estado=new Estado();
		try {
			em.getTransaction().begin();
			em.persist(bean);
			em.flush();
			em.getTransaction().commit();
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}finally{
			em.close();
		}
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Usuario> listarUsuarios() throws Exception {
		em=emf.createEntityManager();
		List<Usuario> listaUsuarios=new ArrayList<Usuario>();
		try {
			Query q = em.createQuery("Select u from Usuario u");
			listaUsuarios=q.getResultList();
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}finally{
			em.close();
		}
		return listaUsuarios;
	}

	@Override
	public Usuario buscarUsuario(Usuario bean) throws Exception {
		em=emf.createEntityManager();
		Usuario entidad=null;
		try {
			entidad= new Usuario();
			entidad=em.find(Usuario.class, bean.getCodUsuario());
			System.out.println("EN MI BUSCAR USUARIO ");
			System.out.println("CODIGO : "+ entidad.getCodUsuario());
			System.out.println("USUARIO : "+ entidad.getNombre()+" "+ entidad.getApePaterno()+" "+entidad.getApeMaterno());
		} catch (Exception e) {
			System.out.println(e.getMessage());
			
		}finally{
			em.close();
		}
		return entidad;
	}

	@Override
	public void actualizarUsuario(Usuario bean) throws Exception {
		em=emf.createEntityManager();
		Usuario usuario=null;
		try {
			em.getTransaction().begin();
			usuario= em.find(Usuario.class, bean.getCodUsuario());
			
			usuario.setApeMaterno(bean.getApeMaterno());
			usuario.setApePaterno(bean.getApePaterno());
			usuario.setContrasenia(bean.getContrasenia());
			usuario.setDireccion(bean.getDireccion());
			usuario.setDni(bean.getDni());
			usuario.setEmail(bean.getEmail());
			usuario.setNombre(bean.getNombre());
			usuario.setTbPerfil(bean.getTbPerfil());
			usuario.setTelefono(bean.getTelefono());
			em.merge(usuario);
			em.flush();
			em.getTransaction().commit();
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}finally{
			em.close();
		}
	}

	@Override
	public void eliminarUsuario(Usuario bean) throws Exception {
		em=emf.createEntityManager();
		Usuario usuario=null;
		try {
			em.getTransaction().begin();
			usuario=em.find(Usuario.class, bean.getCodUsuario());
			em.remove(usuario);
			em.flush();
			em.getTransaction().commit();
			System.out.println("ACABO DE ELIMINAR EL USUARIO");
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}finally{
			em.close();
		}
	}

	@Override
	public Usuario LoginUsuario(Usuario bean) throws Exception {
		em=emf.createEntityManager();
		Usuario login=null;
		try {
			Query q = em.createQuery("Select p from Usuario p where p.dni="+bean.getDni()
					+" and p.tbEstado.codEstado=6");
			login=(Usuario) q.getSingleResult();
			System.out.println("*************** BUSCAR A USUARIO POR EL LOGIN**************************");
			System.out.println("MI USUARIO ES : " + login.getDni());
			System.out.println("EL NOMBRE ES : " + login.getNombre()+" "+ login.getApePaterno()+" "+login.getApeMaterno());
		
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}finally{
			em.close();
		}
		return login;
	}

	@Override
	public Boolean ValidarUsuarioDNI(Usuario bean) throws Exception {
		em=emf.createEntityManager();
		boolean respuesta=false;
		try {
			Query p = em.createQuery("Select p from Usuario p where p.dni="+bean.getDni());
			if (p.getResultList().size()!=0) {
				respuesta=true;
			}
			System.out.println("MI RESPUESTA ES : " + respuesta);
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
		return respuesta;
	}
	
	public void TercerIntentoBloqueado(Usuario bean)throws Exception{
		em=emf.createEntityManager();
		Usuario usuario=null;
		Estado estado=null;
		try {
			em.getTransaction().begin();
			System.out.println("mi usuario para el bloqueo es : "+bean.getNombre()+" "+bean.getApePaterno()+" "+bean.getApeMaterno() );
			System.out.println("SU DNI PARA BLOQUEAR ES : "+bean.getDni());
			System.out.println("ENTRE A MI DAO DE MI TERCER INTENDO PARA BLOQUEAR USUARIO");
			usuario=em.find(Usuario.class, bean.getCodUsuario());
			estado=new Estado();
			estado.setCodEstado(7);//7= Bloqueado;
			usuario.setTbEstado(estado);
			em.merge(usuario);
			em.flush();
			em.getTransaction().commit();
			System.out.println("YA REALICE COMMIT Y YA EH MODIFICADO");
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}finally{
			em.close();
		}
	}

	@Override
	public void OlvideMiContrasenia(Usuario bean) throws Exception {
		em=emf.createEntityManager();
		try {
		Query p = em.createQuery("Select u from Usuario u where u.dni="+bean.getDni());
		bean=(Usuario) p.getSingleResult();
		EnviarCorreo.EnviarMail(bean);
		System.out.println("ESTOY EN MI DAO, Y PARECE QUE YA ENVIO EL CORREO AL USUARIO");
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}finally{
			em.close();
		}
	}

}
